package com.ideviu.service.impl;

import java.util.List;

import javax.jws.WebService;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.dao.DataIntegrityViolationException;
import org.springframework.orm.jpa.JpaSystemException;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
import org.springframework.stereotype.Service;

import com.ideviu.dao.AnuncioDao;
import com.ideviu.dao.NegocioDao;
import com.ideviu.dao.UserDao;
import com.ideviu.model.Anuncio;
import com.ideviu.model.Negocio;
import com.ideviu.service.DataNotFoundException;
import com.ideviu.service.NegocioExistsException;
import com.ideviu.service.NegocioManager;


/**
 * Implementation of UserManager interface.
 *
 * @author <a href="mailto:matt@raibledesigns.com">Matt Raible</a>
 */
@Service("negocioManager")
@WebService(serviceName = "NegocioService", endpointInterface = "com.ideviu.service.NegocioService")
public class NegocioManagerImpl extends GenericManagerImpl<Negocio, Long> implements NegocioManager {
	
	@Autowired
    private NegocioDao negocioDao;
	@Autowired
    private AnuncioDao anuncioDao;
	@Autowired
    private UserDao userDao;

    public void setNegocioDao(NegocioDao negocioDao) {
    	super.dao = negocioDao;
        this.negocioDao = negocioDao;
    }
    
    public void setAnuncioDao(AnuncioDao anuncioDao) {
    	this.anuncioDao = anuncioDao;
    }
    
    public void setUserDao(UserDao userDao) {
		this.userDao = userDao;
	}

	/**
     * {@inheritDoc}
     */
    public Negocio getNegocio(String negocioId) {
        return negocioDao.get(new Long(negocioId));
    }

    /**
     * {@inheritDoc}
     */
    public Negocio saveNegocio(Negocio negocio) throws NegocioExistsException {

        if (negocio.getVersion() == null) {
            // Si el negocio es nuevo.... realizamos las transformaciones adecuadas,
        	// como por ejemplo convertir la cadena de la localizaci�n a X e Y
        	// para su posterior inserci�n en BBDD
            
        }

        try {
        	// Guardamos los anuncios del negocio
        	for(Anuncio anu: negocio.getSetAnuncios()){
        		anuncioDao.saveAnuncio(anu);
        	}
            return negocioDao.saveNegocio(negocio);
        } catch (DataIntegrityViolationException e) {
            //e.printStackTrace();
            log.warn(e.getMessage());
            throw new NegocioExistsException("Negocio '" + negocio.getId() + " - " + negocio.getNombre() + "' ya existe!");
        } catch (JpaSystemException e) { // needed for JPA
            //e.printStackTrace();
            log.warn(e.getMessage());
            throw new NegocioExistsException("Negocio '" + negocio.getId() + " - " + negocio.getNombre() + "' ya existe!");
        }
    }

    /**
     * {@inheritDoc}
     */
    public void removeNegocio(String negocioId) {
        log.debug("eliminando negocio: " + negocioId);
        negocioDao.remove(new Long(negocioId));
    }

    /**
     * {@inheritDoc}
     */
    public List<Negocio> search(String searchTerm) {
        return super.search(searchTerm, Negocio.class);
    }
    
    /**
     * {@inheritDoc}
     *
     * @param username the login name of the human
     * @return User the populated user object
     * @throws UsernameNotFoundException thrown when username not found
     * @throws DataNotFoundException 
     * @throws NumberFormatException 
     */
    public List<Negocio> getNegociosByIdUsuario(String idUser) throws DataNotFoundException {
        try{
        	return negocioDao.getNegociosByIdUsuario(new Long(idUser));
        } catch(NumberFormatException nfe){
        	throw new DataNotFoundException("No existen negocios asociados al usuario con id '" + idUser);
        }	
    }
}
